package projet.camping.domaineTest;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

import projet.camping.domaine.Habitation;
import projet.camping.domaine.Habitation.TypeHabitation;
import projet.camping.domaine.Joueur;
import projet.camping.domaine.User;

public class JoueurTest {

	// Test bidon, aucun test n'est effectue dans joueur, c'est gere plus haut
	// dans partie
	@Test
	public void testSetPret() {
		Joueur j = new Joueur(new User("Jean"));
		assertFalse(j.isPret());
		j.setPret();
		assertTrue(j.isPret());
	}

	@Test
	public void testJoueurUser() {
		Joueur j = new Joueur(new User("Jean"));
		assertNotNull(j);
	}

	@Test
	public void testGetMesHabitations() {
		Joueur j = new Joueur(new User("Jean"));
		assertNotNull(j.getMesHabitations());
		assertFalse(j.getMesHabitations().isEmpty());
		for (TypeHabitation th : j.getMesHabitations().keySet()) {
			assertNotNull(j.getMesHabitations().get(th));
		}
	}

	@Test
	public void testGetMesTirs() {
		Joueur j = new Joueur(new User("Jean"));
		assertTrue(j.getMesTirs().isEmpty());
		Joueur j2 = new Joueur(new User("Jean"));
		j.attaquer(1, 1, j2);
		assertNotNull(j.getMesTirs());
		assertFalse(j.getMesTirs().isEmpty());
	}

	// Test d'une attaque sur la coord de base d'une habitation
	@Test
	public void testAttaquer1() {
		Joueur j1 = new Joueur(new User("Andre"));
		Joueur j2 = new Joueur(new User("Max"));
		int cpt = 1;
		for (TypeHabitation th : j1.getMesHabitations().keySet()) {
			j1.getMesHabitations().get(th).setX(1);
			j1.getMesHabitations().get(th).setY(cpt++);
		}

		cpt = 1;
		for (TypeHabitation th : j2.getMesHabitations().keySet()) {
			j2.getMesHabitations().get(th).setX(1);
			j2.getMesHabitations().get(th).setY(cpt++);
		}
		assertNotNull(j1.attaquer(1, 1, j2));
	}

	// Test d'une attaque rate
	@Test
	public void testAttaquer2() {
		Joueur j1 = new Joueur(new User("Andre"));
		Joueur j2 = new Joueur(new User("Max"));
		int cpt = 1;
		for (TypeHabitation th : j1.getMesHabitations().keySet()) {
			j1.getMesHabitations().get(th).setX(1);
			j1.getMesHabitations().get(th).setY(cpt++);
		}

		cpt = 1;
		for (TypeHabitation th : j2.getMesHabitations().keySet()) {
			j2.getMesHabitations().get(th).setX(1);
			j2.getMesHabitations().get(th).setY(cpt++);
		}
		assertNull(j1.attaquer(8, 8, j2));
	}

	// Test d'une attaque sur la coord calcule d'une habitation
	@Test
	public void testAttaquer3() {
		Joueur j1 = new Joueur(new User("Andre"));
		Joueur j2 = new Joueur(new User("Max"));
		int yCampCar = 0;
		int cpt = 1;
		for (TypeHabitation th : j1.getMesHabitations().keySet()) {
			j1.getMesHabitations().get(th).setX(1);
			j1.getMesHabitations().get(th).setY(cpt++);

		}

		cpt = 1;
		for (TypeHabitation th : j2.getMesHabitations().keySet()) {
			j2.getMesHabitations().get(th).setX(1);
			j2.getMesHabitations().get(th).setY(cpt++);
			if (th.equals(TypeHabitation.CampingCar)) {
				yCampCar = cpt - 1;
			}
		}
		Habitation h = j2.getMesHabitations().get(TypeHabitation.CampingCar);
		assertNotNull(j1.attaquer(h.getX() - 1 + h.getTaille(), yCampCar, j2));
	}

	@Test
	public void testSeFaitAttaquer1() {
		Joueur j1 = new Joueur(new User("Andre"));
		int cpt = 1;
		for (TypeHabitation th : j1.getMesHabitations().keySet()) {
			j1.getMesHabitations().get(th).setX(1);
			j1.getMesHabitations().get(th).setY(cpt++);
		}
		assertNotNull(j1.seFaitAttaquer(1, 1));
	}

	@Test
	public void testSeFaitAttaquer2() {
		Joueur j1 = new Joueur(new User("Andre"));
		int yCampCar = 0;
		int cpt = 1;
		for (TypeHabitation th : j1.getMesHabitations().keySet()) {
			j1.getMesHabitations().get(th).setX(1);
			j1.getMesHabitations().get(th).setY(cpt++);
			if (th.equals(TypeHabitation.CampingCar)) {
				yCampCar = cpt - 1;
			}
		}
		Habitation h = j1.getMesHabitations().get(TypeHabitation.CampingCar);
		assertNotNull(j1.seFaitAttaquer(h.getX() - 1 + h.getTaille(), yCampCar));
	}

	@Test
	public void testSeFaitAttaquer3() {
		Joueur j1 = new Joueur(new User("Andre"));
		int cpt = 1;
		for (TypeHabitation th : j1.getMesHabitations().keySet()) {
			j1.getMesHabitations().get(th).setX(1);
			j1.getMesHabitations().get(th).setY(cpt++);
		}
		assertNull(j1.seFaitAttaquer(8, 8));
	}

	@Test
	public void testIsOutOfPastis() {
		Joueur j1 = new Joueur(new User("Andre"));
		for (TypeHabitation th : j1.getMesHabitations().keySet()) {
			Habitation h = j1.getMesHabitations().get(th);
			while (!h.estDetruit()) {
				h.incrCptTouche();
			}
		}
		assertTrue(j1.isOutOfPastis());
	}

}
